package com.dahua.cglib;

import com.dahua.luban.E;
import org.springframework.cglib.core.SpringNamingPolicy;
import org.springframework.cglib.proxy.Enhancer;

/**
 * @author chen_MingLiang
 * @version 1.0
 * @date 2020/1/28 22:15
 */
public class Test {
	public static void main(String[] args) throws IllegalAccessException, InstantiationException {
		Enhancer enhancer = new Enhancer();
		//JDK动态代理中,实现逻辑的地方是InvocationHandler,而CGLIB中,实现代理逻辑的地方是CallBack接口,Spring的MethodInterceptor对其做了实现-->
		//-->所以在spring中,我们需要传一个MethodInterceptor的实现类
		//在spring创建@Bean中的bean的过程中,使用了CGLIB代理,那么它传了callbackFilter,我们可以从源-->
			//-->码看到ConfigurationClassEnhancer类中enhancer.setCallbackFilter(CALLBACK_FILTER);,里面new了...(CALLBACKS),这个CALLBACKS包含了-->
			//-->new BeanMethodInterceptor(),new BeanFactoryAwareMethodInterceptor(),,关键看BeanMethodInterceptor()-->
			//-->if (isCurrentlyInvokedFactoryMethod(beanMethod))在这里判断f()方法中是否有e()方法,如果有,这调用e的super,如果没有,执行f()
		//设置父类-->AppConfig
		enhancer.setSuperclass(CGLIBDemo.class);//代理类是子类.AppConfig是父类
		enhancer.setCallback(new MyMethodInterceptor());
		CGLIBDemo cglibProxy = (CGLIBDemo) enhancer.create();
		cglibProxy.cglibMethod();

//		//设置实现这个接口
//		enhancer.setInterfaces(new Class<?>[] {ConfigurationClassEnhancer.EnhancedConfiguration.class});
//		//设置工厂
//		enhancer.setUseFactory(false);
//		//设置名字的生成策略--->$$Enhancer---很长的名字就是这个策略
//		enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
//		//设置一个策略,属性
//		enhancer.setStrategy(new ConfigurationClassEnhancer.BeanFactoryAwareGeneratorStrategy(classLoader));
//		enhancer.setCallbackFilter(CALLBACK_FILTER);
//		enhancer.setCallbackTypes(CALLBACK_FILTER.getCallbackTypes());
	}
}
